package server.comunicacion;


//import cliente.comunicacion.ICliente;
import cliente.comunicacion.ICliente;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;

import server.dominio.Beneficiario;
import server.dominio.ISesion;
import server.dominio.Medico;

import server.excepciones.BeneficiarioInexistenteException;
import server.excepciones.BeneficiarioNoExistenteException;
import server.excepciones.BeneficiarioYaExistenteException;
import server.excepciones.MedicoInexistenteException;
import server.excepciones.MedicoNoExistenteException;
import server.excepciones.MedicoYaExistenteException;
import server.excepciones.UsuarioIncorrectoException;

import server.negocio.Controlador_G_Usuarios;
import server.negocio.Controlador_Login;
import server.negocio.Controlador_MensajeAux;
import server.negocio.Controlador_Servidor;

import server.presentacion.JF_Servidor;



public class ServidorA extends UnicastRemoteObject implements IServidorA {

	/**
	 * 
	 */
    private static final long serialVersionUID = 1L;
//    private Hashtable<ID_iSESION, iCliente> sesiones;

    private Controlador_Servidor c_servidor;
    private Controlador_Login c_login;
    private Controlador_G_Usuarios c_g_usuarios;
    private Controlador_MensajeAux c_mensajeaux;

    public ServidorA(JF_Servidor ventanav) throws RemoteException {
            super();
            LocateRegistry.createRegistry(2994);


            
            //Inicialización del controlador
            c_servidor= new Controlador_Servidor(this, ventanav);
            c_login= new Controlador_Login(c_servidor);
            c_g_usuarios= new Controlador_G_Usuarios(c_servidor);
            c_mensajeaux= new Controlador_MensajeAux(c_servidor, c_g_usuarios);

	}

    public void conectar() throws MalformedURLException, RemoteException {
        try {
            Naming.bind("rmi://localhost:2994/ServidorA", this);
            c_servidor.log("Naming_bind: rmi://localhost:2994/ServidorA OK");
        }
        catch (AlreadyBoundException ex) {
            Naming.rebind("rmi://localhost:2994/ServidorA", this);
            c_servidor.log("Naming_rebind: rmi://localhost:2994/ServidorA OK");
        }

    }

    public void desconectar() throws RemoteException, MalformedURLException, NotBoundException {
        Naming.unbind("rmi://localhost:2994/ServidorA");
        c_servidor.log("Naming_unbind: rmi://localhost:2994/ServidorA OK");
    }

	/*@Override
	public void anularCita(long idSesion, Cita cita) throws RemoteException,
			CitaNoValidaException, SQLException, Exception {
		// TODO Auto-generated method stub

	}*/

	@Override
	public void crear(long idSesion, Beneficiario beneficiario)
			throws RemoteException, BeneficiarioYaExistenteException,
			SQLException, Exception {

            c_g_usuarios.crearbeneficiario(idSesion, beneficiario);
	}

	@Override
	public void crear(long idSesion, Medico medico) throws RemoteException,
			MedicoYaExistenteException, SQLException, Exception {
		// TODO Auto-generated method stub
               c_g_usuarios.crearmedico(idSesion, medico);
	}

	//@Override
	public void eliminar(long idSesion, Medico medico) throws RemoteException,
			MedicoNoExistenteException, SQLException, Exception {
		// TODO Auto-generated method stub

	}

	
	@Override
	public Beneficiario getBeneficiario(long idSesion, String dni)
			throws RemoteException, BeneficiarioInexistenteException,
			SQLException, Exception {
            // TODO Auto-generated method stub
            return c_g_usuarios.obtenerBeneficiario(idSesion, dni);
	}

	//@Override
	public Beneficiario getBeneficiarioPorNSS(long idSesion, String nss)
			throws RemoteException, BeneficiarioInexistenteException,
			SQLException, Exception {
		// TODO Auto-generated method stub
		return c_g_usuarios.obtenerBeneficiario(idSesion, nss);
	}


	@Override
	public Medico getMedico(long idSesion, String dni) throws RemoteException,
			MedicoInexistenteException, SQLException, Exception {
		// TODO Auto-generated method stub
		return c_g_usuarios.obtenerMedico(idSesion, dni);
	}

	@Override
	public void modificar(long idSesion, Beneficiario beneficiario)
			throws RemoteException, BeneficiarioNoExistenteException,
			SQLException, Exception {
		// TODO Auto-generated method stub
            c_g_usuarios.modificarBeneficiario(idSesion, beneficiario);
		
	}

	@Override
	public void modificar(long idSesion, Medico medico) throws RemoteException,
			MedicoNoExistenteException, SQLException, Exception {
		// TODO Auto-generated method stub
            c_g_usuarios.modificarMedico(idSesion, medico);
	}

    public ISesion identificar(String login, String password) throws RemoteException, UsuarioIncorrectoException, SQLException {
        //return sesion
        return c_login.login(login, password);
    }

   public void registrar(long idSesion, ICliente cliente) throws RemoteException, Exception {
        c_servidor.registrar(idSesion, cliente);
    }

    public void mensajeAuxiliar(long idSesion, long codigoDeMensaje, Object informacion) throws RemoteException, SQLException, Exception {
        c_mensajeaux.analizarmensajeAuxiliar(idSesion, codigoDeMensaje, informacion);
    }
    


}

